package com.hmk.blogboot.service.Impl;

import com.hmk.blogboot.NotFoundException;
import com.hmk.blogboot.dao.TypeRepository;
import com.hmk.blogboot.po.Type;
import com.hmk.blogboot.service.TypeService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class TypeServiceImpl  implements TypeService {

    //自动注入分类的dao接口
    @Autowired
    private TypeRepository typeRepository;


    /*保存分类 返回新增的分类*/
    @Transactional
    @Override
    public Type saveType(Type type) {
        //注入的dao接口调用save方法，传递进来的分类进行添加到数据库Type表中
        return typeRepository.save(type);
    }

    /*根据id获取分类*/
    @Override
    @Transactional
    public Type getType(Long id) {
        //注入的分类的数据持久化接口typeRepository调用findOne(id)根据id返回一条插叙到的分类记录

        return typeRepository.getOne(id);
    }

    /*根据分类名称获取分类*/
    @Override
    public Type getTypeByName(String name) {
        //根据使用自动注入typeRepository接口的findByName方法分类名称进行查询
        return  typeRepository.findByName(name);
    }

    /*分类进行分页查询 返回Page<Type>
    *
    * @param  pageable表示进行分页信息
    * */
    @Override
    @Transactional
    public Page<Type> listType(Pageable pageable) {
        return typeRepository.findAll(pageable);
    }

    /*根据id进行查询分类， 查询到分类进行修改*/
    @Override
    @Transactional
    public Type updateType(Long id, Type type) {
        //根据id获取分类记录
        Type t = typeRepository.getOne(id);
        //进行判断，在数据库中有没有查询到记录
        if(t == null){
            throw new NotFoundException("数据库不存在该博客分类");
        }
        //查询到type表中的分类记录
        //进行使用spring提供beanUtils工具类，调用静态方法copyProperties()进行
        //把一个对象属性copy另一个对象
        BeanUtils.copyProperties(type,t);
        //修改type copy查询到的记录

        /*
        * t为查询到分类
        * type已经修改后的
        * 修改后type copy 给t 再把t保存到数据库中
        * */
        return typeRepository.save(t);

    }

    /*根据id进行删除分类*/
    @Override
    @Transactional
    public void deleteType(Long id) {
    //使用typeRepository接口调用delete(id)，实现根据id进行删除分类记录
        typeRepository.deleteById(id);
    }

    //获取type表所有type记录
    @Override
    @Transactional
    public List<Type> listType() {
        return typeRepository.findAll();
    }


    //按输入数字显示type列表数
    @Override
    public List<Type> listTypeTop(Integer size) {
        //创建jpa中排序对象Sort
        Sort sort = Sort.by(Sort.Direction.DESC,"blogs.size");
        Pageable pageable = PageRequest.of(0,size,sort);
        return typeRepository.findTop(pageable);
    }


}
